package shujia.day10;

import java.util.ArrayList;
import java.util.Iterator;

/*
    去除集合中自定义对象的重复值(对象的成员变量值都相同)
    Student(name,age)
 */
public class ArrayListTest2 {
    public static void main(String[] args) {
        ArrayList list1 = new ArrayList();

        Student s1 = new Student("张成阳", 18);
        Student s2 = new Student("方直", 19);
        Student s3 = new Student("张成阳", 18);
        Student s4 = new Student("方直", 19);
        Student s5 = new Student("张成阳", 18);
        Student s6 = new Student("方直", 19);

        list1.add(s1);
        list1.add(s2);
        list1.add(s3);
        list1.add(s4);
        list1.add(s5);
        list1.add(s6);

        System.out.println("list1: "+list1);
        System.out.println("----------------------------");

        //创建一个新的集合，遍历旧集合
        //如果新集合中有该元素，说明重复，不添加
        //反之添加到新集合中，最后新集合中存储去重后的结果


        ArrayList list2 = new ArrayList();

        Iterator iterator = list1.iterator();
        while (iterator.hasNext()){
            Student s = (Student) iterator.next();
            if(!list2.contains(s)){
                list2.add(s);
            }
        }
        /*
            我们按照去重字符串的逻辑对学生对象进行去重，发现不太行
            旧集合中的每一个学生对象都添加到了新集合中‘
            从结果来看。每一个学生对象41行的判断【!list2.contains(s)】都是true
            list2.contains(s) 一直都是false
            要想知道为什么list2.contains(s)一直都是false的话，就应该去看contains的源码

            public boolean contains(Object o) {
                // o - new Student("张成阳", 18);
                return indexOf(o) >= 0;
            }

            public int indexOf(Object o) {
            // o - new Student("张成阳", 18);
                if (o == null) {
                    for (int i = 0; i < size; i++)
                        if (elementData[i]==null)
                            return i;
                } else {
                    for (int i = 0; i < this.size; i++) // 遍历新集合，调用元素的equals方法挨个与新集合中的元素进行比较
                        if (o.equals(elementData[i]))
                            return i; // i的值一定是大于等于0
                }
                return -1;
            }

            从源码上来看，底层是调用了元素类型中的equals方法，而我们的元素是学生类，学生类中没有重写该方法，用的是父类Object类中的
            equals方法，比较的是地址值，而每一学生都是new出来的，地址肯定不一样。
            解决方案：元素类型中重写equals方法即可
         */


        System.out.println("list2: "+list2);
    }
}
